import axios from 'axios'
import store from '@/store'
// import router from '@/router'
import { md5, encryptPublic, decryptPrivate, createAesKey, aesEncrypt, aesDecrypt } from '@/secret/secret'
import { Message } from 'element-ui'

const request = axios.create({
  baseURL: process.env.VUE_APP_BASE_URL,
  responseType: 'arraybuffer'
})

// 请求拦截器
request.interceptors.request.use(
  async (config) => {
    config.headers['Content-Type'] = 'application/json'
    if (config.data && config.url !== 'file/upload') {
      // 使用md5对body需要传输的数据生成摘要
      const abstract = md5(JSON.stringify(config.data))
      // 使用RSA公钥对生成的摘要进行加密
      // 将加密后的摘要进行base64编码放入请求头
      const Signature = encryptPublic(abstract)
      config.headers.Signature = Signature
      // 动态生成AES密钥
      const aesKey = createAesKey()
      // 使用AES密钥对需要传输的json数据加密，并将加密好的数据放入body
      config.data = JSON.stringify(config.data)

      const aesSecretContent = aesEncrypt(config.data, aesKey)
      config.data = aesSecretContent
      // 使用RSA公钥对生成AES密钥进行加密
      // 将加密后的AES密钥进行base64编码放入请求头
      const rsaSecretKey = encryptPublic(aesKey)
      config.headers.SecurityKey = rsaSecretKey
    }
    if (store.getters.token) {
      // 给每一个请求添加token
      config.headers.Hefu_Token = store.getters.token
    }
    config.headers.Timestamp = Math.floor(+new Date() / 1000) + ''
    return config
  },
  (err) => {
    return Promise.reject(err)
  }
)

// 响应拦截器
request.interceptors.response.use(res => {
  res.config.responseType = 'arraybuffer'
  if (res.config.headers.Range) {
    return res
  } else {
    // 将SecurityKey使用RSA私钥进行解密得到AES密钥
    const aesKey = decryptPrivate(res.headers.securitykey)
    // 取body数据进行AES解密
    let response = aesDecrypt(res.data, aesKey)
    res.data = JSON.parse(response)
    // 使用md5对解密后body中的数据生成摘要
    response = md5(JSON.stringify(response))
    // switch (res.data.code) {
    //   case 500: {
    //     router.push('/login')
    //   }
    // }
    return res
  }
}, err => {
  switch (err.response.status) {
    case 414: {
      Message({
        type: 'error',
        message: '文件已过期'
      })
    }
  }
  return Promise.reject(err)
})

export default request
